数字电路基础知识——组合逻辑电路 数字电路中有很多基本常用的组合逻辑电路,如编码器、译码器、数据选择器、加法器、比较器。 本次主要介绍译码器、数据选择器。加法器参考:数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器
并用Verilog语言设计简单的组合逻辑电路,如2-4译码器、BCD译码器。 使用Verilog语言设计一个简单的组合逻辑电路(2-4译码器) 设计BCD译码器,输入0~9。采用Verilog描述并画出门级电路图。(4线-10线译码器)
一、译码器
译码器:将输入的二进制码译成对应的输出高、低电平信号 比较常见的译码器有二进制译码器、二——十进制译码器、显示译码器等
二进制译码器(3线-8线译码器) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190907102632933.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ZpdmlkMTE3,size_16,color_FFFFFF,t_70) 74HC138译码器 上面是3-8译码器的逻辑框图和真值表。3-8译码器用的最多的芯片是74HC138芯片。 其有三个控制端S1-3,当 S1=1,S2+S3=0 时,Gs的输出为高电平,译码器处于工作状态。 使用Verilog语言设计一个简单的组合逻辑电路(2-4译码器) 1)使用case语句状态机设计:
module decode_2_4(
input [1:0] data_i,
input en_i,
output [3:0] data_o
);
reg [3:0] decode_o
always @(*)
begin
if (en_i == 1'b1)begin
decode_o = 4'b1111;
end
else begin
case(data_i)
2'b00:
decode_o = 4'b1110;
2'b01:
decode_o = 4'b1101;
2'b10:
decode_o = 4'b1011;
2'b11:
decode_o = 4'b0111;
default:
decode_o = 4'b1111;
endcase
end
end
assign data_o = decode_o;
endmodule
RTL电路图: 2)使用assign语句设计
module decode_2_4(
input [1:0] data_i,
input en_i,
output [3:0] decode_o
);
//assign description
assign decode_o[0] = ~(~data_i[0] & ~data_i[1] & ~en_i);
assign decode_o[1] = ~(~data_i[0] & data_i[1] & ~en_i);
assign decode_o[2] = ~(data_i[0] & ~data_i[1] & ~en_i);
assign decode_o[3] = ~(data_i[0] & data_i[1] & ~en_i);
endmodule
RTL电路图(左图): 需要注意的是,在使用Verilog语句设计组合逻辑电路时(coding style的问题),尽量选择使用assign语句来代替always语句块。尤其是对于if-else语句来说使用 assign = ? : 条件选择语句设计出来的电路会更优,因为if-else语句可能会向下一级传播不定态。 造成逻辑电路错误。
设计BCD译码器,输入0~9。采用Verilog描述并画出门级电路图。(4线-10线译码器)
module Decode_4_10(
input [3:0] indata,
//output reg [9:0] outdata
output [9:0] outdata
);
/*
always @(*)begin
case(indata)
4'b0000: outdata = 10'b1111_1111_10;
4'b0001: outdata = 10'b1111_1111_01;
4'b0010: outdata = 10'b1111_1110_11;
4'b0011: outdata = 10'b1111_1101_11;
4'b0100: outdata = 10'b1111_1011_11;
4'b0101: outdata = 10'b1111_0111_11;
4'b0110: outdata = 10'b1110_1111_11;
4'b0111: outdata = 10'b1101_1111_11;
4'b1000: outdata = 10'b1011_1111_11;
4'b1001: outdata = 10'b0111_1111_11;
default: outdata = 10'b1111_1111_11;
endcase
end
*/
//assign description
assign outdata[0] = ~(~indata[3] & ~indata[2] & ~indata[1] & ~indata[0]);
assign outdata[1] = ~(~indata[3] & ~indata[2] & ~indata[1] & indata[0]);
assign outdata[2] = ~(~indata[3] & ~indata[2] & indata[1] & ~indata[0]);
assign outdata[3] = ~(~indata[3] & ~indata[2] & indata[1] & indata[0]);
assign outdata[4] = ~(~indata[3] & indata[2] & ~indata[1] & ~indata[0]);
assign outdata[5] = ~(~indata[3] & indata[2] & ~indata[1] & indata[0]);
assign outdata[6] = ~(~indata[3] & indata[2] & indata[1] & ~indata[0]);
assign outdata[7] = ~(~indata[3] & indata[2] & indata[1] & indata[0]);
assign outdata[8] = ~(indata[3] & ~indata[2] & ~indata[1] & ~indata[0]);
assign outdata[9] = ~(indata[3] & ~indata[2] & ~indata[1] & indata[0]);
endmodule
|